const axios = require('axios');
const { getWxAPIAccessToken } = require('./accesstoken');
const { getCurrentTimestamp } = require('../../module/tool/time');

/**
 * 获取小程序码，适用于需要的码数量极多的业务场景。通过该接口生成的小程序码，永久有效，数量暂无限制
 * @param page          页面 /pages/index/index
 * @param scene         参数一般是某种id
 * @param envVersion    跳转的小程序环境
 * @returns buffer
 */
async function generatePermanentMultiSceneQRCode (page, scene, envVersion) {
    envVersion = process.env.NODE_ENV === 'release' ? 'release' : 'trial';
    const url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit';
    let res = await axios.post(url + '?access_token=' + await getWxAPIAccessToken(),
        {
            page: page,
            scene: scene,
            width: 430,
            auto_color: false,
            is_hyaline: false,
            env_version: envVersion
        }, {
            responseType: 'arraybuffer'
        }
    );
    return Buffer.from(res.data).toString('base64');
}
/**
 * 获取小程序二维码，适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制
 * @param page      页面 /pages/index/index
 * @param query     参数 foo=bar&xxx=yyy
 * @returns {Promise<string>}
 */
async function generatePermanentFewSceneQRCode (page, query) {
    const url = 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode';
    const res = await axios.post(url + '?access_token=' + await getWxAPIAccessToken(), {
        path: page + '?' + query
    }, {
        responseType: 'arraybuffer'
    });
    return Buffer.from(res.data).toString('base64');
}

/**
 * 获取小程序码，适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制
 * @param page
 * @param query
 * @returns {Promise<string>}
 */
async function createCircleQRCode (page, query) {
    const url = 'https://api.weixin.qq.com/wxa/getwxacode';
    const res = await axios.post(url + '?access_token=' + await getWxAPIAccessToken(), {
        path: page + '?' + query
    }, {
        responseType: 'arraybuffer'
    });
    return Buffer.from(res.data).toString('base64');
}

/**
 * 获取小程序 scheme 码，适用于短信、邮件、外部网页、微信内等拉起小程序的业务场景。
 * 通过该接口，可以选择生成到期失效和永久有效的小程序码，有数量限制，目前仅针对国内非个人主体的小程序开放
 * @param page
 * @param query
 * @param expire
 * @returns {Promise<*>}
 */
async function generateURLScheme (page, query, expire) {
    const url = 'https://api.weixin.qq.com/wxa/generatescheme';
    let res = await axios.post(url + '?access_token=' + await getWxAPIAccessToken(), {
        jump_wxa: {
            path: page,
            query
        },
        is_expire: true,
        expire_time: getCurrentTimestamp() + expire
    });
    return res.openlink;
}

async function createPathQrLink (path, query, envVersion) {
    const url = 'https://api.weixin.qq.com/wxa/generatescheme';
    envVersion = envVersion || 'release';
    const res = await axios.post(url + '?access_token=' + await getWxAPIAccessToken(), {
        jump_wxa:
            {
                path,
                query,
                env_version: envVersion
            }
    });
    return res.data.openlink;
}

module.exports = {
    generatePermanentMultiSceneQRCode,
    generatePermanentFewSceneQRCode,
    createCircleQRCode,
    generateURLScheme,
    createPathQrLink
};
